"""
定义接口或者抽象基类

问题：
    你想定义一个接口或抽象类，并且通过执行类型检查来确保子类实现了某些特定的方法。
解决方案：
    使用 abc 模块可以很轻松的定义抽象基类。
"""

from abc import ABCMeta, abstractmethod


class Person(metaclass=ABCMeta):
    @property
    @abstractmethod
    def name(self):
        pass

    @name.setter
    @abstractmethod
    def name(self, value):
        pass

    def eat(self):
        print("Person 吃")

    @abstractmethod
    def drink(self):
        print("Person 喝")

    @classmethod
    @abstractmethod
    def play(cls):
        print("Person 玩")

    @staticmethod
    @abstractmethod
    def happy():
        print("Person 乐")


class User(Person):
    def __init__(self):
        self._name = None

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, value):
        self._name = value

    def drink(self):
        print("User 喝")

    @classmethod
    def play(cls):
        print("User 玩")

    @staticmethod
    def happy():
        print("User 乐")


def use_user():
    user = User()
    user.name = "Kevin"
    print(user.name)
    user.eat()
    user.drink()
    User.play()
    User.happy()
    # 输出结果：
    """
    Kevin
    Person 吃
    User 喝
    User 玩
    User 乐
    """


if __name__ == '__main__':
    use_user()
